iT邦幫忙

2023 iThome 鐵人賽

DAY 5
2

今天我們來到了本地環境的建置,這一個部分會和 cloud build 的流程相關,因為 cloud build 所使用到的 dockerfile 是本地版本的衍生版,藉由 dockerfile 去管理環境,可以確保大幅減少環境不一致的問題。

另外也將 compose file 選用了 compose V2 的版本

使用 Laravel OctaneRoadRunner

在 Stack 的選擇我用了 laravel octane + RoadRunner 的方式去運行 laravel

RoadRunner 是個使用 golang 實作的高性能 Web server,並且實作了 PSR-7,透過 Goridge 把 request 封裝成 PSR-7 Request 後轉送至 PHP 的 worker,在這個部分可以將應用常駐在記憶體中,相較於 PHP-fpm 的架構,帶來更高的效能。

在大多數的情境中,可以提供比 apache or nginx 乘載更高的服務容量。而且可以在 autoscale 的情境中提供可接受的冷啟動 (cold start) 延遲。

製作 Dockerfile

定義中除了 port 8080 是為 web server 所設定的,另外也將 postgres 的 port 54321 開發出來以便本地的 client 可以直接連線至資料庫查詢。

另外如果是使用 apple silicon 的 mac 的開發者,請記得要新增platform 去指定目前使用的 image 支援的 platform,所以這邊我有指定了 linux/arm64

以下是本地環境的 Docker Compose 檔案:

services:
  app:
    build:
      context: .
      dockerfile: .deploy/local.Dockerfile
    restart: unless-stopped
    tty: true
    depends_on:
      - database
    working_dir: /var/www/html
    # uncomment this for running the app at start
    #    command: composer run rr
    ports:
      - "8080:8080"
    volumes:
      - ./:/var/www/html
    networks:
      - app-network

  database:
    image: postgres:15
    platform: linux/arm64
    environment:
      - POSTGRES_USER=local
      - POSTGRES_PASSWORD=root
      - POSTGRES_DB=laravel
      - PGDATA=/var/lib/postgresql/data/db-files/
    volumes:
      - database-vol:/var/lib/postgresql/data
    ports:
      - "54321:5432"
    networks:
      - app-network

#Docker Networks
networks:
  app-network:
    driver: bridge

#Volumes
volumes:
  database-vol:
    driver: local

這邊的 dockerfile 是前一篇文章中所提到的 api + base 而成的,不一樣的有這邊預先裝好了 composer 與 container 在啟動時不會自動執行 web server。

FROM php:8.2-cli-buster
ENV XDEBUG="false"
ENV COMPOSER_ALLOW_SUPERUSER=1

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        libz-dev \
        libpq-dev \
        libjpeg-dev \
        libpng-dev \
        libfreetype6-dev \
        libssl-dev \
        libmcrypt-dev \
        libmagickwand-dev \
        nano \
        htop \
        libxml2-dev \
        libzip-dev \
        unzip \
        && rm -r /var/lib/apt/lists/*

# Install soap extention
RUN docker-php-ext-install soap exif pcntl zip pdo_pgsql bcmath sockets

RUN MAKEFLAGS="-j $(nproc)" pecl install  -o -f grpc && docker-php-ext-enable grpc

#
#------------------------------------------------------
# xDebug
#------------------------------------------------------
#

# Install the xdebug extension
#RUN pecl install xdebug && docker-php-ext-enable xdebug

# Copy xdebug configration for remote debugging
#COPY ./php/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini

#
#------------------------------------------------------
# Composer
#------------------------------------------------------
#

# Install composer and add its bin to the PATH.
RUN curl -s http://getcomposer.org/installer | php && \
    echo "export PATH=${PATH}:/var/www/vendor/bin" >> ~/.bashrc && \
    mv composer.phar /usr/local/bin/composer
# Source the bash
RUN . ~/.bashrc

#
#------------------------------------------------------
# Laravel Schedule Cron Job
#------------------------------------------------------
#

#RUN echo "* * * * * root /usr/local/bin/php /var/www/artisan schedule:run >> /dev/null 2>&1"  >> /etc/cron.d/laravel-scheduler
#RUN chmod 0644 /etc/cron.d/laravel-scheduler

#
#------------------------------------------------------
# Final Touch
#------------------------------------------------------
#

ADD .deploy/php/local.ini /usr/local/etc/php/conf.d
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data

WORKDIR /var/www

EXPOSE 8080
VOLUME ["/var/www"]

CMD ["bash"]

初始化 Laravel project

由於希望可以藉由 container 的環境去執行相關的建置,所以這邊先採取了將 dockefile 在 build 完後,才開始建立專案。

# Create project by composer
composer create-project laravel/laravel example-app
cp -r example-app/. .
rm -rf example-app/

# Install dependency
composer require laravel/octane

開發工具

在本地環境中,我們可以安裝一些開發輔助工具來幫助我們開發 Laravel 應用。

以下是一些常用的開發輔助工具:

  • Clockwork:一個用於監控與紀錄相關 debug 細節的工具。
  • Laravel IDE Helper:自動產生方便靜態分析使用的 type hinet。
  • Pest:包裝 PHP unit 但是更強大又簡單使用的測試套件。

我們可以使用 Composer 來安裝這些開發輔助工具:

# Install dev tools
composer require --dev itsgoingd/clockwork
composer require --dev barryvdh/laravel-ide-helper
composer require --dev pestphp/pest --with-all-dependencies

這三個是我在開發時一定會使用的開發輔助工具,在輔助靜態分析、快速建立測試,到 debug 所有的 request 提供了一個透明度高的細節,讓開發不再痛苦又撞牆。

Reference


上一篇
#3 API Service 的第一步: 流程與環境
下一篇
#5 API Service 的第三步: 萬事起頭難,但是很重要的資料庫規劃
系列文
Laravel 擴展宇宙:從 1 到 100 十倍速打造產品獨角獸30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
mikehsu0618
iT邦新手 1 級 ‧ 2023-09-20 11:49:42

Laravel Octane 也太潮了吧

我要留言

立即登入留言